### Makefile for Emacs refcards

## Copyright (C) 1993-1994, 2001-2025 Free Software Foundation, Inc.

## This file is part of GNU Emacs.
#
## GNU Emacs is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.

## GNU Emacs is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.

### Commentary:

## See README for details.

PDF_ENGLISH = \
	calccard.pdf \
	dired-ref.pdf \
	gnus-booklet.pdf \
	gnus-refcard.pdf \
	orgcard.pdf \
	refcard.pdf \
	survival.pdf \
	viperCard.pdf

PDF_CZECH = \
	cs-dired-ref.pdf \
	cs-refcard.pdf \
	cs-survival.pdf

PDF_FRENCH = \
	fr-dired-ref.pdf \
	fr-refcard.pdf \
	fr-survival.pdf

PDF_GERMAN = de-refcard.pdf

PDF_POLISH = pl-refcard.pdf

PDF_PORTUGUESE = pt-br-refcard.pdf

PDF_RUSSIAN = ru-refcard.pdf

PDF_SLOVAKIAN = \
	sk-dired-ref.pdf \
	sk-refcard.pdf \
	sk-survival.pdf

PDF_TARGETS = $(PDF_ENGLISH) $(PDF_CZECH) $(PDF_FRENCH) $(PDF_GERMAN) \
	$(PDF_POLISH) $(PDF_PORTUGUESE) $(PDF_RUSSIAN) $(PDF_SLOVAKIAN)

PS_ENGLISH = $(PDF_ENGLISH:.pdf=.ps)
PS_CZECH = $(PDF_CZECH:.pdf=.ps)
PS_FRENCH = $(PDF_FRENCH:.pdf=.ps)
PS_GERMAN = $(PDF_GERMAN:.pdf=.ps)
PS_POLISH = $(PDF_POLISH:.pdf=.ps)
PS_PORTUGUESE = $(PDF_PORTUGUESE:.pdf=.ps)
PS_RUSSIAN = $(PDF_RUSSIAN:.pdf=.ps)
PS_SLOVAKIAN = $(PDF_SLOVAKIAN:.pdf=.ps)

PS_TARGETS = $(PDF_TARGETS:.pdf=.ps)


## For emacsver.tex.
ENVADD = TEXINPUTS=".:$(TEXINPUTS)"


.PHONY: all pdf ps

all: pdf
pdf: $(PDF_TARGETS)
ps: $(PS_TARGETS)


.PHONY: english czech french german polish portuguese russian slovakian
english: $(PDF_ENGLISH)
czech: $(PDF_CZECH)
french: $(PDF_FRENCH)
german: $(PDF_GERMAN)
polish: $(PDF_POLISH)
portuguese: $(PDF_PORTUGUESE)
russian: $(PDF_RUSSIAN)
slovakian: $(PDF_SLOVAKIAN)

.PHONY: english-ps czech-ps french-ps german-ps polish-ps portuguese-ps russian-ps slovakian-ps
english-ps: $(PS_ENGLISH)
czech-ps: $(PS_CZECH)
french-ps: $(PS_FRENCH)
german-ps: $(PS_GERMAN)
polish-ps: $(PS_POLISH)
portuguese-ps: $(PS_PORTUGUESE)
russian-ps: $(PS_RUSSIAN)
slovakian-ps: $(PS_SLOVAKIAN)


## Default for file that do not use a different paper size.
.SUFFIXES: .ps .dvi
.dvi.ps:
	dvips -t letter -o $@ $<


make_cs=if pdfcsplain --version > /dev/null 2> /dev/null; then \
	  $(ENVADD) pdfcsplain $$input; \
	else \
	  $(ENVADD) csplain "\pdfoutput=1\input $$input"; \
	fi

## For pdf output, the page layouts (a4/letter) are written directly
## in the .tex files.

## For PostScript output, note that some of the tex files (refcard,
## de-refcard, fr-refcard, pt-br-refcard) have settings for letter or
## a4 paper.  The Following are the default paper sizes (letter for English,
## A4 for translations).
## FIXME orgcard.ps does not fit on letter (see orgcard.tex).

## A4, landscape: de-refcard, fr-refcard, pt-br-refcard orgcard
## A4, portrait: cs-*, fr-dired-ref, sk-*, pl-refcard, ru-refcard
## Letter, landscape: calccard, refcard
## Letter, portrait (suffix rule): dired-ref, gnus-*, survival, vip*

calccard_deps = calccard.tex emacsver.tex pdflayout.sty
calccard.pdf: $(calccard_deps)
	$(ENVADD) pdftex calccard.tex
calccard.dvi: $(calccard_deps)
	$(ENVADD) tex calccard.tex
calccard.ps: calccard.dvi
	dvips -t letter -t landscape -o $@ calccard.dvi

cs_dired_ref_deps = cs-dired-ref.tex emacsver.tex pdflayout.sty
cs-dired-ref.pdf: $(cs_dired_ref_deps)
	input=cs-dired-ref.tex; $(make_cs)
cs-dired-ref.dvi: $(cs_dired_ref_deps)
	$(ENVADD) csplain cs-dired-ref.tex
cs-dired-ref.ps: cs-dired-ref.dvi
	dvips -t a4 -o $@ cs-dired-ref.dvi

cs_refcard_deps = cs-refcard.tex emacsver.tex pdflayout.sty
cs-refcard.pdf: $(cs_refcard_deps)
	input=cs-refcard.tex; $(make_cs)
cs-refcard.dvi: $(cs_refcard_deps)
	$(ENVADD) csplain cs-refcard.tex
cs-refcard.ps: cs-refcard.dvi
	dvips -t a4 -o $@ cs-refcard.dvi

cs_survival_deps = cs-survival.tex emacsver.tex pdflayout.sty
cs-survival.pdf: $(cs_survival_deps)
	input=cs-survival.tex; $(make_cs)
cs-survival.dvi: $(cs_survival_deps)
	$(ENVADD) csplain cs-survival.tex
cs-survival.ps: cs-survival.dvi
	dvips -t a4 -o $@ cs-survival.dvi

de_refcard_deps = de-refcard.tex emacsver.tex pdflayout.sty
de-refcard.pdf: $(de_refcard_deps)
	$(ENVADD) pdftex de-refcard.tex
de-refcard.dvi: $(de_refcard_deps)
	$(ENVADD) tex de-refcard.tex
de-refcard.ps: de-refcard.dvi
	dvips -t a4 -t landscape -o $@ de-refcard.dvi

dired_ref_deps = dired-ref.tex emacsver.tex pdflayout.sty
dired-ref.pdf: $(dired_ref_deps)
	$(ENVADD) pdftex dired-ref.tex
dired-ref.dvi: $(dired_ref_deps)
	$(ENVADD) tex dired-ref.tex

fr_dired_ref_deps = fr-dired-ref.tex emacsver.tex pdflayout.sty
fr-dired-ref.pdf: $(fr_dired_ref_deps)
	$(ENVADD) pdftex fr-dired-ref.tex
fr-dired-ref.dvi: $(fr_dired_ref_deps)
	$(ENVADD) tex fr-dired-ref.tex
fr-dired-ref.ps: fr-dired-ref.dvi
	dvips -t a4 -o $@ fr-dired-ref.dvi

fr_refcard_deps = fr-refcard.tex emacsver.tex pdflayout.sty
fr-refcard.pdf: $(fr_refcard_deps)
	$(ENVADD) pdftex fr-refcard.tex
fr-refcard.dvi: $(fr_refcard_deps)
	$(ENVADD) tex fr-refcard.tex
fr-refcard.ps: fr-refcard.dvi
	dvips -t a4 -t landscape -o $@ fr-refcard.dvi

fr_survival_deps = fr-survival.tex emacsver.tex pdflayout.sty
fr-survival.pdf: $(fr_survival_deps)
	$(ENVADD) pdftex fr-survival.tex
fr-survival.dvi: $(fr_survival_deps)
	$(ENVADD) tex fr-survival.tex
fr-survival.ps: fr-survival.dvi
	dvips -t a4 -o $@ fr-survival.dvi

## No dependency on emacsver.tex, pdflayout.sty; no need for ENVADD.
gnus_booklet_deps = gnus-refcard.tex gnus-logo.pdf
gnus-booklet.pdf: $(gnus_booklet_deps)
	pdflatex -jobname=gnus-booklet '\def\booklettrue{}\def\letterpapertrue{}\input{gnus-refcard}'
gnus-booklet.dvi: gnus-refcard.tex gnus-logo.eps
	latex '\def\booklettrue{}\def\letterpapertrue{}\input{gnus-refcard}'
	mv gnus-refcard.dvi $@

###gnus-logo.pdf: gnus-logo.eps
###	ps2pdf gnus-logo.eps

## No dependency on emacsver.tex, pdflayout.sty; no need for ENVADD.
gnus_refcard_deps = gnus-refcard.tex gnus-logo.pdf
gnus-refcard.pdf: $(gnus_refcard_deps)
	pdflatex gnus-refcard.tex
gnus-refcard.dvi: $(gnus_refcard_deps)
	latex gnus-refcard.tex

orgcard_deps = orgcard.tex emacsver.tex pdflayout.sty
orgcard.pdf: $(orgcard_deps)
	$(ENVADD) pdftex orgcard.tex
orgcard.dvi: $(orgcard_deps)
	$(ENVADD) tex orgcard.tex
orgcard.ps: orgcard.dvi
	dvips -t a4 -t landscape -o $@ orgcard.dvi

pl_refcard_deps = pl-refcard.tex emacsver.tex pdflayout.sty
## Some versions of pdfmex seem to create dvi by default, hence output-format.
pl-refcard.pdf: $(pl_refcard_deps)
	if ! kpsewhich -format=fmt mex > /dev/null && \
	  ! pdfmex --version > /dev/null 2> /dev/null; then \
	  echo "No mex format found."; false; \
	fi
	$(ENVADD) pdftex -output-format=pdf pl-refcard.tex
pl-refcard.dvi: $(pl_refcard_deps)
	if kpsewhich -format=fmt mex > /dev/null; then \
	  $(ENVADD) tex pl-refcard.tex; \
	else \
	  $(ENVADD) mex pl-refcard.tex; \
	fi
pl-refcard.ps: pl-refcard.dvi
	dvips -t a4 -o $@ pl-refcard.dvi

pt_br_refcard_deps = pt-br-refcard.tex emacsver.tex pdflayout.sty
pt-br-refcard.pdf: $(pt_br_refcard_deps)
	$(ENVADD) pdftex pt-br-refcard.tex
pt-br-refcard.dvi: $(pt_br_refcard_deps)
	$(ENVADD) tex pt-br-refcard.tex
pt-br-refcard.ps: pt-br-refcard.dvi
	dvips -t a4 -t landscape -o $@ pt-br-refcard.dvi

refcard_deps = refcard.tex emacsver.tex pdflayout.sty
refcard.pdf: $(refcard_deps)
	$(ENVADD) pdftex refcard.tex
refcard.dvi: $(refcard_deps)
	$(ENVADD) tex refcard.tex
refcard.ps: refcard.dvi
	dvips -t letter -t landscape -o $@ refcard.dvi

## No dependency on emacsver.tex, pdflayout.sty; no need for ENVADD.
ru_refcard_deps = ru-refcard.tex
ru-refcard.pdf: $(ru_refcard_deps)
	pdflatex ru-refcard.tex
ru-refcard.dvi: $(ru_refcard_deps)
	latex ru-refcard.tex
ru-refcard.ps: ru-refcard.dvi
	dvips -t a4 -o $@ ru-refcard.dvi

sk_dired_ref_deps = sk-dired-ref.tex emacsver.tex pdflayout.sty
sk-dired-ref.pdf: $(sk_dired_ref_deps)
	input=sk-dired-ref.tex; $(make_cs)
sk-dired-ref.dvi: $(sk_dired_ref_deps)
	$(ENVADD) csplain sk-dired-ref.tex
sk-dired-ref.ps: sk-dired-ref.dvi
	dvips -t a4 -o $@ sk-dired-ref.dvi

sk_refcard_deps = sk-refcard.tex emacsver.tex pdflayout.sty
sk-refcard.pdf: $(sk_refcard_deps)
	input=sk-refcard.tex; $(make_cs)
sk-refcard.dvi: $(sk_refcard_deps)
	$(ENVADD) csplain sk-refcard.tex
sk-refcard.ps: sk-refcard.dvi
	dvips -t a4 -o $@ sk-refcard.dvi

sk_survival_deps = sk-survival.tex emacsver.tex pdflayout.sty
sk-survival.pdf: $(sk_survival_deps)
	input=sk-survival.tex; $(make_cs)
sk-survival.dvi: $(sk_survival_deps)
	$(ENVADD) csplain sk-survival.tex
sk-survival.ps: sk-survival.dvi
	dvips -t a4 -o $@ sk-survival.dvi

survival_deps = survival.tex emacsver.tex pdflayout.sty
survival.pdf: $(survival_deps)
	$(ENVADD) pdftex survival.tex
survival.dvi: $(survival_deps)
	$(ENVADD) tex survival.tex

vipercard_deps = viperCard.tex emacsver.tex pdflayout.sty
viperCard.pdf: $(vipercard_deps)
	$(ENVADD) pdftex viperCard.tex
viperCard.dvi: $(vipercard_deps)
	$(ENVADD) tex viperCard.tex


.PHONY: clean

clean:
	-rm -f ./*.dvi ./*.log ./*.aux

distclean: clean

## This should really by maintainer-clean, but the handling of the
## refcards is funny.  So abuse extraclean for this.
extraclean: clean
	-rm -f $(PDF_TARGETS) $(PS_TARGETS)

## For the Emacs website.
dist:
	rm -rf emacs-refcards
	mkdir emacs-refcards
	cp Makefile README *.tex gnus-logo.* pdflayout.sty emacs-refcards/
	tar -cf emacs-refcards.tar emacs-refcards
	rm -rf emacs-refcards

### Makefile ends here
